# This GitHub action runs your tests for each commit push and/or PR. Optionally
# you can turn it on using a cron schedule for regular testing.
#
name: Tests
on:
  pull_request:
    paths-ignore:
      - 'README.md'
  push:
    paths-ignore:
      - 'README.md'
    branches: [master]
    
  # For systems with an upstream API that could drift unexpectedly (like most SaaS systems, etc.),
  # we recommend testing at a regular interval not necessarily tied to code changes. This will 
  # ensure you are alerted to something breaking due to an API change, even if the code did not
  # change.
  # schedule:
  #   - cron: '0 13 * * *'
jobs:
  # ensure the code builds...
  build:
    name: Build
    runs-on: ubuntu-latest
    timeout-minutes: 5
    steps:

    - name: Check out code into the Go module directory
      uses: actions/checkout@v3

    - name: Set up Go
      uses: actions/setup-go@v3
      with:
        go-version-file: 'go.mod'
        cache: true
      id: go

    - name: Get dependencies
      run: |
        go mod download

    - name: Build
      run: |
        go build -v .

  generate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-go@v3
        with:
          go-version-file: 'go.mod'
          cache: true
      - run: go generate ./...
      - name: git diff
        run: |
          git diff --compact-summary --exit-code || \
            (echo; echo "Unexpected difference in directories after code generation. Run 'go generate ./...' command and commit."; exit 1)

  # run acceptance tests in a matrix with Terraform core versions
  test:
    name: Matrix Test
    needs: build
    runs-on: ubuntu-latest    

    services:
      clickhouse:
        image: clickhouse/clickhouse-server

        env:
          CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: 1
        ports:
          - 8123:8123
          - 9000:9000
          - 9009:9009
        # Set health checks to wait until redis has started
        options: >-
          --health-cmd "clickhouse-client --database=system --query='select * from databases'"
          --health-interval 15s
          --health-timeout 5s
          --health-retries 5
          
    timeout-minutes: 15
    strategy:
      fail-fast: false
      matrix:
        # list whatever Terraform versions here you would like to support
        terraform:
          - '0.12.*'
          - '0.13.*'
          - '0.14.*'
          - '0.15.*'
          - '1.0.*'
          - '1.1.*'
          - '1.2.*'
    steps:

    - name: Check out code into the Go module directory
      uses: actions/checkout@v3

    - name: Set up Go
      uses: actions/setup-go@v3
      with:
        go-version-file: 'go.mod'
        cache: true
      id: go

    - uses: hashicorp/setup-terraform@v2
      with:
        terraform_version: ${{ matrix.terraform }}
        terraform_wrapper: false

    - name: Get dependencies
      run: |
        go mod download
        
    - name: TF acceptance tests
      timeout-minutes: 10
      env:
        TF_ACC: "1"
        TF_CLICKHOUSE_HOST: "127.0.0.1"
        TF_CLICKHOUSE_USERNAME: "default"
        TF_CLICKHOUSE_PASSWORD: ""
        TF_CLICKHOUSE_PORT: "9000"

        # Set whatever additional acceptance test env vars here. You can
        # optionally use data from your repository secrets using the
        # following syntax:
        # SOME_VAR: ${{ secrets.SOME_VAR }}

      run: |
        go test -v -cover -tags testing ./...